from django.core.management.base import BaseCommand
from users.models import User
from admin_management.models import AdminUser, Role, Permission, RolePermission, UserRole


class Command(BaseCommand):
    help = '初始化管理员权限系统'
    
    def handle(self, *args, **options):
        self.stdout.write('开始初始化管理员权限系统...')
        
        # 创建基础权限
        self.create_permissions()
        
        # 创建基础角色
        self.create_roles()
        
        # 为角色分配权限
        self.assign_permissions_to_roles()
        
        # 创建超级管理员
        self.create_super_admin()
        
        self.stdout.write(self.style.SUCCESS('管理员权限系统初始化完成！'))
    
    def create_permissions(self):
        """创建基础权限"""
        self.stdout.write('创建基础权限...')
        
        permissions = [
            # 管理员用户权限
            ('admin_user:read', '查看管理员用户', '管理员用户管理'),
            ('admin_user:create', '创建管理员用户', '管理员用户管理'),
            ('admin_user:update', '更新管理员用户', '管理员用户管理'),
            ('admin_user:delete', '删除管理员用户', '管理员用户管理'),
            
            # 角色权限
            ('role:read', '查看角色', '角色管理'),
            ('role:create', '创建角色', '角色管理'),
            ('role:update', '更新角色', '角色管理'),
            ('role:delete', '删除角色', '角色管理'),
            ('role:manage', '管理角色', '角色管理'),
            
            # 权限管理
            ('permission:read', '查看权限', '权限管理'),
            ('permission:create', '创建权限', '权限管理'),
            ('permission:update', '更新权限', '权限管理'),
            ('permission:delete', '删除权限', '权限管理'),
            
            # 用户角色权限
            ('user_role:read', '查看用户角色', '用户角色管理'),
            ('user_role:create', '分配用户角色', '用户角色管理'),
            ('user_role:update', '更新用户角色', '用户角色管理'),
            ('user_role:delete', '删除用户角色', '用户角色管理'),
            
            # 审计日志权限
            ('audit_log:read', '查看审计日志', '审计日志'),
            
            # 系统配置权限
            ('system_config:read', '查看系统配置', '系统配置'),
            ('system_config:create', '创建系统配置', '系统配置'),
            ('system_config:update', '更新系统配置', '系统配置'),
            ('system_config:delete', '删除系统配置', '系统配置'),
            
            # 用户管理权限
            ('user_management:read', '查看用户', '用户管理'),
            ('user_management:update', '更新用户', '用户管理'),
            ('user_management:delete', '删除用户', '用户管理'),
            ('user_management:manage', '管理用户', '用户管理'),
            
            # 产品管理权限
            ('product:read', '查看产品', '产品管理'),
            ('product:create', '创建产品', '产品管理'),
            ('product:update', '更新产品', '产品管理'),
            ('product:delete', '删除产品', '产品管理'),
            
            # 投资组合管理权限
            ('portfolio:read', '查看投资组合', '投资组合管理'),
            ('portfolio:create', '创建投资组合', '投资组合管理'),
            ('portfolio:update', '更新投资组合', '投资组合管理'),
            ('portfolio:delete', '删除投资组合', '投资组合管理'),
            
            # 数据服务权限
            ('data_service:read', '查看数据服务', '数据服务'),
            ('data_service:manage', '管理数据服务', '数据服务'),
            
            # 仪表板权限
            ('dashboard:read', '查看仪表板', '仪表板'),
        ]
        
        for code, name, category in permissions:
            # 从code中提取resource和action
            if ':' in code:
                resource, action = code.split(':', 1)
            else:
                resource = category.lower()
                action = 'read'
            
            permission, created = Permission.objects.get_or_create(
                code=code,
                defaults={
                    'name': name,
                    'resource': resource,
                    'action': action,
                    'description': f'{name}权限'
                }
            )
            if created:
                self.stdout.write(f'  创建权限: {code} - {name}')
    
    def create_roles(self):
        """创建基础角色"""
        self.stdout.write('创建基础角色...')
        
        roles = [
            ('super_admin', '超级管理员', '拥有所有权限的超级管理员'),
            ('admin', '管理员', '拥有大部分管理权限的管理员'),
            ('operator', '操作员', '拥有基本操作权限的操作员'),
            ('viewer', '查看者', '只能查看数据的角色'),
        ]
        
        for code, name, description in roles:
            role, created = Role.objects.get_or_create(
                code=code,
                defaults={
                    'name': name,
                    'description': description
                }
            )
            if created:
                self.stdout.write(f'  创建角色: {code} - {name}')
    
    def assign_permissions_to_roles(self):
        """为角色分配权限"""
        self.stdout.write('为角色分配权限...')
        
        # 超级管理员拥有所有权限
        super_admin_role = Role.objects.get(code='super_admin')
        all_permissions = Permission.objects.all()
        for permission in all_permissions:
            RolePermission.objects.get_or_create(
                role=super_admin_role,
                permission=permission
            )
        self.stdout.write(f'  为超级管理员分配了 {all_permissions.count()} 个权限')
        
        # 管理员权限
        admin_role = Role.objects.get(code='admin')
        admin_permissions = [
            'admin_user:read', 'role:read', 'permission:read',
            'user_role:read', 'user_role:create', 'user_role:update', 'user_role:delete',
            'audit_log:read', 'system_config:read', 'system_config:update',
            'user_management:read', 'user_management:update',
            'product:read', 'product:create', 'product:update',
            'portfolio:read', 'portfolio:create', 'portfolio:update',
            'data_service:read', 'dashboard:read'
        ]
        for perm_code in admin_permissions:
            try:
                permission = Permission.objects.get(code=perm_code)
                RolePermission.objects.get_or_create(
                    role=admin_role,
                    permission=permission
                )
            except Permission.DoesNotExist:
                continue
        self.stdout.write(f'  为管理员分配了 {len(admin_permissions)} 个权限')
        
        # 操作员权限
        operator_role = Role.objects.get(code='operator')
        operator_permissions = [
            'user_management:read', 'product:read', 'product:create', 'product:update',
            'portfolio:read', 'portfolio:create', 'portfolio:update',
            'data_service:read', 'dashboard:read'
        ]
        for perm_code in operator_permissions:
            try:
                permission = Permission.objects.get(code=perm_code)
                RolePermission.objects.get_or_create(
                    role=operator_role,
                    permission=permission
                )
            except Permission.DoesNotExist:
                continue
        self.stdout.write(f'  为操作员分配了 {len(operator_permissions)} 个权限')
        
        # 查看者权限
        viewer_role = Role.objects.get(code='viewer')
        viewer_permissions = [
            'user_management:read', 'product:read', 'portfolio:read',
            'data_service:read', 'dashboard:read'
        ]
        for perm_code in viewer_permissions:
            try:
                permission = Permission.objects.get(code=perm_code)
                RolePermission.objects.get_or_create(
                    role=viewer_role,
                    permission=permission
                )
            except Permission.DoesNotExist:
                continue
        self.stdout.write(f'  为查看者分配了 {len(viewer_permissions)} 个权限')
    
    def create_super_admin(self):
        """创建超级管理员"""
        self.stdout.write('创建超级管理员...')
        
        # 检查是否已存在超级管理员
        if User.objects.filter(username='admin').exists():
            self.stdout.write('  超级管理员已存在，跳过创建')
            return
        
        # 创建超级管理员用户
        admin_user = User.objects.create_user(
            username='admin',
            email='admin@example.com',
            password='admin123456',
            first_name='Super',
            last_name='Admin',
            is_staff=True,
            is_superuser=True
        )
        
        # 创建管理员配置
        admin_profile = AdminUser.objects.create(
            user=admin_user,
            is_super_admin=True,
            is_active=True
        )
        
        # 分配超级管理员角色
        super_admin_role = Role.objects.get(code='super_admin')
        UserRole.objects.create(
            user=admin_user,
            role=super_admin_role,
            assigned_by=admin_user,
            is_active=True
        )
        
        self.stdout.write('  创建超级管理员成功')
        self.stdout.write('  用户名: admin')
        self.stdout.write('  密码: admin123456')
        self.stdout.write('  请在生产环境中修改默认密码！')